#ifndef _EVENT_DISPATCH_STRUCT_HPP_
#define _EVENT_DISPATCH_STRUCT_HPP_

/**
 * 这个类是接口类，实现事件的内部存储功能
 * 
 * 事件如何存储：
 *
 * 1 应该是一个dic，以事件id为key，每个key保存一个序列作为一个value
 * 2 应该为每一个value序列提供一套遍历、增加、删除的方法
 * 3 value序列里面的元素，应该是唯一的
 *
 * # 故一个正常程序员应该能够看出来这个结构体的标准类型应该是
 * #  外层套上一个字典，字典的每一个键是事件id，值是一个集合
 */

template<typename T>  // 参数T是每个value的类型
class event_dispatch_struct
{
  // $$公共定义
public:
  /**
   * 遍历用的回调函数
   *
   * @param1: 是用户传进来的参数callback_arg
   * @param2: 是遍历得到的数据 _val
   */
  typedef int  (*callback_func)(void *, const T&);

  /**
   * 全体遍历用的回调函数
   *
   * @param1: 用户参数
   * @param2: 事件id
   * @param3: 事件结构
   */
  typedef void (*clean_func)(void*, long, const T&);

  // $$公共接口
public:
  // 结构里面是否有这个关于事件id的数据
  virtual bool has_node( long _key )=0;

  // 结构里面是否有关于这个监听器的内容
  virtual bool has_node( long _key, T _val )=0;

  // 给这个事件id加入一条数据
  virtual void add_node( long _key, T _val )=0;

  // 把这个事件id里面的数据的相关内容删除
  virtual void del_node( long _key, T _val )=0;

  // 对这个事件id里面的内容进行遍历
  virtual int  for_each( long _key, callback_func _func, void* callback_arg )=0;

  // 对所有事件id里面的内容进行遍历
  virtual void for_each( clean_func _func, void* callback_arg )=0;
};

#endif//_EVENT_DISPATCH_STRUCT_HPP_
